package com.ibeeking.found.cms.b.rest.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.ibeeking.found.cms.b.rest.service.IPageTemplateBaseService;
import com.ibeeking.found.cms.b.rest.service.IPageTemplateModuleService;
import com.ibeeking.found.cms.service.common.bo.PageTemplateBaseBO;
import com.ibeeking.found.cms.service.common.bo.PageTemplateModuleBO;
import com.ibeeking.found.cms.service.common.dos.PageTemplateModuleDO;
import com.ibeeking.found.cms.service.common.param.PageTemplateModuleParam;
import com.ibeeking.found.cms.service.common.query.PageBasePageQuery;
import com.ibeeking.found.cms.service.common.query.PageModulePageQuery;
import com.ibeeking.found.cms.service.common.query.PageModuleQuery;
import com.ibeeking.found.cms.service.common.query.PageTemplatePageQuery;
import com.ibeeking.found.cms.service.common.vo.*;
import com.ibeeking.found.cms.service.mapper.PageTemplateModuleMapper;
import com.ibeeking.found.common.entity.CurrentUser;
import com.ibeeking.found.common.utils.UserUtils;
import com.ibeeking.nematos.core.utils.SpringBeanUtil;
import com.ibeeking.nematos.exception.BusinessException;
import com.ibeeking.nematos.utils.bean.BeanUtil;
import com.ibeeking.nematos.utils.data.Collections3;
import com.ibeeking.nematos.utils.data.StringUtils;
import com.ibeeking.nematos.utils.json.JsonUtils;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ibeeking.found.cms.service.common.vo.*;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @ClassName PageModuleServiceImpl
 * @Description
 * @Author ibeeking
 * @Date 2021-05-08 16:03
 **/
@Service
public class PageTemplateModuleServiceImpl extends ServiceImpl<PageTemplateModuleMapper, PageTemplateModuleDO> implements IPageTemplateModuleService {

    @Resource
    private PageTemplateModuleMapper pageTemplateModuleMapper;
    @Resource
    private IPageTemplateBaseService pageTemplateBaseServiceImpl;


    @Override
    public List<PageTemplateModuleBO> list(PageModuleQuery pageModuleQuery) {
        LambdaQueryWrapper<PageTemplateModuleDO> queryWrapper = new LambdaQueryWrapper<PageTemplateModuleDO>()
                .in(Collections3.isNotEmpty(pageModuleQuery.getPageIds()), PageTemplateModuleDO::getPageId, pageModuleQuery.getPageIds())
                .eq(pageModuleQuery.getPageId() != null, PageTemplateModuleDO::getPageId, pageModuleQuery.getPageId());
        List<PageTemplateModuleDO> pageModuleDOs = pageTemplateModuleMapper.selectList(queryWrapper);
        return JsonUtils.jsonToList(pageModuleDOs, PageTemplateModuleBO.class);
    }

    @Override
    public List<PageTemplateModuleBO> selByPageId(Long pageId) {
        if (pageId == null) {
            return Collections3.emptyList();
        }
        return getBean().list(new PageModuleQuery().setPageId(pageId));
    }

    @Override
    public List<PageTemplateModuleBO> selByPageId(Set<Long> pageIds) {
        if (Collections3.isEmpty(pageIds)) {
            return Collections3.emptyList();
        }
        return getBean().list(new PageModuleQuery().setPageIds(pageIds));
    }

    @Override
    public Page<PageModuleVO> pageList(PageModulePageQuery pageModulePageQuery) {
        Page<PageTemplateModuleDO> pages = pageTemplateModuleMapper.selectPage(new Page<PageTemplateModuleDO>(), new LambdaQueryWrapper<PageTemplateModuleDO>());
        return BeanUtil.convertPage(pages, PageModuleVO.class);
    }

    @Override
    public PageModuleAllView viewByPageId(Long pageId) {
        PageTemplateBaseBO pageBaseBO = pageTemplateBaseServiceImpl.selById(pageId);
        List<PageTemplateModuleBO> pageModuleBOS = getBean().selByPageId(pageId);
        return getBean().baseView(pageBaseBO, pageModuleBOS);
    }

    @Override
    public Page<PageModuleAllView> pageTemplateViewPageList(PageTemplatePageQuery param, CurrentUser currentUser) {
        PageBasePageQuery pageBasePageQuery = BeanUtil.convertBean(param, PageBasePageQuery.class);
        Page<PageBaseVO> pageBaseVOPage = pageTemplateBaseServiceImpl.pageList(pageBasePageQuery, currentUser);
        List<PageBaseVO> records = pageBaseVOPage.getRecords();
        if (Collections3.isEmpty(records)) {
            return new Page<>();
        }
        Set<Long> pageIds = records.stream().map(PageBaseVO::getId).collect(Collectors.toSet());
        List<PageTemplateBaseBO> pageTemplateBaseBOS = pageTemplateBaseServiceImpl.selById(pageIds);
        if (Collections3.isEmpty(pageTemplateBaseBOS)) {
            return new Page<>();
        }
        List<PageTemplateModuleBO> pageTemplateModuleBOS = getBean().selByPageId(pageIds);
        Map<Long, List<PageTemplateModuleBO>> map = pageTemplateModuleBOS.stream().collect(Collectors.groupingBy(PageTemplateModuleBO::getPageId));
        List<PageModuleAllView> list = CollUtil.newArrayList();
        pageTemplateBaseBOS.forEach(x -> {
            List<PageTemplateModuleBO> moduleBOS = map.get(x.getId());
            list.add(this.baseView(x, moduleBOS));
        });
        Page<PageModuleAllView> pageModuleAllViewPage = BeanUtil.convertPage(pageBaseVOPage, PageModuleAllView.class);
        pageModuleAllViewPage.setRecords(list);
        return pageModuleAllViewPage;
    }

    @Override
    public Page<PageTemplateVO> pageTemplatePageList(PageTemplatePageQuery param, CurrentUser currentUser) {
        PageBasePageQuery pageBasePageQuery = BeanUtil.convertBean(param, PageBasePageQuery.class);
        Page<PageBaseVO> pageBaseVOPage = pageTemplateBaseServiceImpl.pageList(pageBasePageQuery, currentUser);
        return BeanUtil.convertPage(pageBaseVOPage, PageTemplateVO.class);
    }

    @Override
    public PageModuleAllView baseView(PageTemplateBaseBO pageBaseBO, List<PageTemplateModuleBO> pageModuleDOS) {
        if (pageBaseBO == null) {
            throw BusinessException.create("当前页面数据不存在!");
        }
        PageModuleAllView pageModuleAllView = BeanUtil.convertBean(pageBaseBO, PageModuleAllView.class);
        List<PageModuleView> moduleList = pageModuleDOS.stream().map(x -> {
            PageModuleView pageModuleView = new PageModuleView();
            pageModuleView.setId(x.getId());
            pageModuleView.setPageId(x.getPageId());
            pageModuleView.setSort(x.getSort());
            pageModuleView.setType(x.getType());
            pageModuleView.setDataField(JsonUtils.fromJson(x.getDataField(), JSONObject.class));
            return pageModuleView;
        }).collect(Collectors.toList());
        pageModuleAllView.setModuleList(moduleList);
        return pageModuleAllView;
    }

    @Override
    public Boolean changeStatus(Long id, Integer status) {
        PageTemplateModuleDO pageModuleDO = new PageTemplateModuleDO();
        pageModuleDO.setId(id);
        pageModuleDO.setModifyTime(LocalDateTime.now());
        return pageTemplateModuleMapper.updateById(pageModuleDO) > 0;
    }

    @Override
    public Boolean del(Long id) {
        if (id == null) {
            return false;
        }
        return pageTemplateModuleMapper.deleteById(id) > 0;
    }

    @Override
    public Boolean delByPageId(Long pageId) {
        if (pageId == null) {
            return false;
        }
        return pageTemplateModuleMapper.delete(new LambdaQueryWrapper<PageTemplateModuleDO>().eq(PageTemplateModuleDO::getPageId, pageId)) > 0;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean addList(List<PageTemplateModuleParam> paramList) {
        if (Collections3.isEmpty(paramList)) {
            return false;
        }
        List<PageTemplateModuleDO> pageTemplateModuleDOS = JsonUtils.jsonToList(paramList, PageTemplateModuleDO.class);
        pageTemplateModuleDOS.stream().forEach(d->{
            if(StringUtils.isEmpty(d.getIndustry())){
                d.setIndustry(UserUtils.getTenantIndustry());
            }
            d.setCreateBy(UserUtils.getUserId());
            d.setCreateTime(LocalDateTime.now());
            d.setModifyTime(LocalDateTime.now());
        });
        return pageTemplateModuleMapper.insertBatchSomeColumn(pageTemplateModuleDOS) > 0;
    }

    private PageTemplateModuleServiceImpl getBean() {
        return SpringBeanUtil.getBean(this.getClass());
    }


}